//「一本通 3.2 例 1」Sightseeing Trip
//floyd算法变体
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN=100;
const int INF=0x7fffffff;
int n,m;
int w[MAXN+1][MAXN+1];
int mindis[MAXN+1][MAXN+1];
int mindis_mid[MAXN+1][MAXN+1];
int mincircle;
vector<int> path;

void savepath(int x,int y){
    int k=mindis_mid[x][y];
    if (k>0){
        savepath(x,k);
        savepath(k,y);
    }else path.push_back(x);
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        w[x][y]=w[y][x]=w[x][y]>0?min(w[x][y],z):z;
    }
    fill(mindis[0],mindis[0]+(MAXN+1)*(MAXN+1),INF);
    for(int x=1;x<=n;x++)
        for(int y=1;y<=n;y++) 
            if (w[x][y]>0) mindis[x][y]=w[x][y];
    mincircle=INF;
    for(int k=1;k<=n;k++){
        for(int x=1;x<k;x++)
            for(int y=x+1;y<k;y++ ){
                    //此时的mindis[x][y]只通过小于k的结点
                    if (mindis[x][y]<INF&&w[y][k]>0&&w[k][x]>0
                        &&mincircle>mindis[x][y]+w[y][k]+w[k][x]){
                        mincircle=mindis[x][y]+w[y][k]+w[k][x];
                        path.clear();
                        savepath(x,y);
                        path.push_back(y);
                        path.push_back(k);
                    }
            }
        /*for(int x=1;x<=n;x++)
            for(int y=1;y<=n;y++) {
                if (x!=k&&k!=y&&y!=x){
                    //更新通过k的最短路径
                    if (mindis[x][k]<INF&&mindis[k][y]<INF&&
                        mindis[x][k]+mindis[k][y]<mindis[x][y]){
                            mindis[x][y]=mindis[x][k]+mindis[k][y];
                            mindis_mid[x][y]=k;
                        }
                }
            }*/
        //利用对称性，可对上面的代码简化下
        for(int x=1;x<=n;x++)
            for(int y=x+1;y<=n;y++) {
                //更新通过k的最短路径
                if (mindis[x][k]<INF&&mindis[k][y]<INF&&
                    mindis[x][k]+mindis[k][y]<mindis[x][y]){
                        mindis[x][y]=mindis[y][x]=mindis[x][k]+mindis[k][y];
                        mindis_mid[x][y]=mindis_mid[y][x]=k;
                    }
            }
    }
    //输出答案
    if (mincircle<INF){  
        for(int k=0;k<path.size();k++) cout<<path[k]<<' ';
    }else {
        cout<<"No solution.";
    }
}
